@Haggard
2年前 提问
1个回答

针对栈溢出攻击的预防措施有哪些

安全侠
2年前

针对栈溢出攻击的预防措施有以下这些:

  • 地址空间随机化:顾名思义,程序每次加载到的内存位置是随机的,所以,即使可以利用栈溢出控制函数的返回地址,但是无法确定恶意代码的位置,因此,可以有效地防范栈溢出攻击。

  • 不可执行栈:不可执行栈的基本原理是将数据所在的内存页标记为不可执行的,当进程尝试去执行数据页面上的指令时,CPU就会抛出异常,而不是去执行。所以,当开启了不可执行栈选项时,即使我们的恶意代码已经插入到内存,但由于处在数据页面,因此无法执行从而实现防御攻击。

  • Stack Guard:具体是再缓冲区(如:栈)和控制信息(如 ebp等)间插入一个canary word。这样,当缓冲区溢出时,再返回地址被覆盖之前canary word会首先被覆盖,通过检测canary word的值是否被修改,就可以判断是否发生了溢出,如果出现溢出则进行终止溢出的进程来进行防御。

  • 使用模糊识别检测:由于溢出类漏洞的填充数据对于攻击本身是没有意义的,即只是用来占位以达到数据长度的目的,这部分一般会被攻击者以习惯模式填充(如多个字符重复多遍),而这部分数据在正常访问情况下,是外部输入中有意义的部分。另外输入的shellcode和跳转地址部分与正常的输入一般情况下也有差别,基于这些差别可以建立起来模糊识别的模型,用于检测对未知漏洞的攻击。

  • 使用基于虚拟技术的检测技术:对于安全性要求很高、需要重点防护的系统,基于漏洞特征与攻击特征的防御难免还有漏网之鱼。就像Honey Pot系统可以用真实的系统做诱饵也可以虚拟一个诱饵系统一样,防御设备也可以虚拟一个跟真实系统相近的系统,用于检测对系统的访问是否存在攻击。